14章 pydanticによる実行時型チェック
早い段階でエラーを見つけたい(シフトレフト)
ここまでの『ロバストPython』で型チェッカの使い方を指南してきた
ユーザは不正なデータを渡す
プログラム外から渡る不正データ
読み込んだときにエラーを検知したい(14.1)
型チェッカと実行時エラーの間隙を埋めるバリデーションロジックが必要(14.3)
渡ってくる不正データに対して #Pydantic
可読性を犠牲にせずバリデーションロジックのコード量を削減できる (14章 冒頭)
型定義を読む開発者は、そのデータ型のオブジェクトに課された制約を正確に把握できる。(14.3)
読みやすい型定義があるだけだが、実行時チェックも追加されている(IMO:一石二鳥感)
IMO:Pydanticはドメインモデルレベルで使えるものなのだろうか?(プログラム言語同様の抽象と言える?)
レストランを表すデータ型の例
https://github.com/pviafore/RobustPython/blob/dafb95d801dff2c8ff7856ba46d3c052d54e0033/code_examples/chapter14/restaurant.yaml
PyYAMLで読み込み、データ型として持つ
67種類のテストケース:https://github.com/pviafore/RobustPython/blob/dafb95d801dff2c8ff7856ba46d3c052d54e0033/code_examples/chapter14/test_cases.txt
TypedDictを使う案(14.1)
ユーザのデータを読み込む関数は辞書を返す(TypedDictを返すでアノテーションしただけ)
アノテーションされた関数からは、ユーザのデータが不正なら誤った辞書が返る(フィールドが足りないなど)
返ったTypedDictを使う側はキー名や値の型のバリデーションが効く
フィールドのバリデーションも辞書の利用者がやる
Pydantic(14.2)
触りたい:pydantic.dataclasses.dataclass
データを読み込む関数でオブジェクト構築までする(return Restaurant(**data))
pydanticによりオブジェクト構築時にバリデーション。読み込んだときのエラー検知が実現
Pydanticのmypyプラグインを有効にできる(Mypy (Pydantic))
バリデータ
constr
何文字以上・以下
正規表現にマッチした文字列
conlist
要素数の制約
@validator("属性名")
Pydanticはパースライブラリ
出るものが正しいことを保証する
入力に制限を加えるにはstrictフィールドを使う
不変式(10章参照)まわり
pydanticのdataclassデコレータ、つまりデータクラス
pydanticを使えば、特殊メソッド__init__()を呼び出したり、フィールドを設定したりする場合も含めて不変式を守れる
データクラスとクラスの間隙も埋める
著者の主張として、フィールドに相互依存があればデータクラスではなくクラスを使うべき
ロバストPython 14章のpydanticをV2に上げる